﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace Financial_Assistant
{
    /// <summary>
    /// Логика взаимодействия для ConsumeProfitWindow.xaml
    /// </summary>
    public partial class ConsumeProfitWindow : Window
    {
        private string _connectionString =
                @"Data Source = CHRISTINABEIM\SQLEXPRESS; Initial Catalog=Financial_Assistant; Trusted_Connection=True;"; //( ip-сервера, имя БД, разрешение соединения)
        
        private string UserID = String.Empty; // нужен для проверки наличия такищ счетов для данного пользователя
        private string ActionID = String.Empty;
        private bool type = false; // определяет доход или расход
        private bool ActionType = true; // true - добавление, false - изменение

        public ConsumeProfitWindow(MyBoolAction _type, string userID, string actionID, string date, string category, string countName, string summ, string definition, bool _actionType)
        {
            InitializeComponent();

            UserID = userID;
            ActionType = _actionType;
            ActionID = actionID;

            DataBox.Text = date;
            SumBox.Text = summ;
            DefinitionBox.Text = definition;

            //если type=true то доход иначе расход
            if (_type == MyBoolAction.Profit)
            {
                this.Title = "Карточка доходов";
                type = true;
            }
            else
            {
                this.Title = "Карточка расходов";
                type = false;
            }

            //при инициализации загрузить данные в комбобокс
            LoadCombobox(); 
            //поставить значения для обоих комбобоксов, равное пришедшему в конструктор
            CategoryComboBox.SelectedItem = category;
            CountComboBox.SelectedItem = countName;
        }

        private void LoadCombobox()
        {
            //Очищаем комбобокс категорий
            CategoryComboBox.Items.Clear();
            //List<string> categoryList = new List<string>();

            StringBuilder query = new StringBuilder();
            query.Append("SELECT Наименование FROM [Используемые категории] where [ID пользователя] = '");
            query.Append(UserID + "' and Вид = '");
            query.Append(type + "'");

            SqlConnection connection = new SqlConnection(_connectionString);
            connection.Open(); // открыть считывание

            SqlCommand command = new SqlCommand(query.ToString(), connection);
            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                for (int j = 0; j < reader.FieldCount; j++)
                {
                    //categoryList.Add(reader[j].ToString());
                    CategoryComboBox.Items.Add(reader[j].ToString());
                }
            }
            reader.Dispose();
            command.Dispose();
            
            //Аналогично для счета
            CountComboBox.Items.Clear();
            //List<string> countList = new List<string>();
            query.Clear();
            query.Append("SELECT Наименование FROM Счета where [ID пользователя] = '");
            query.Append(UserID + "'");

            command = new SqlCommand(query.ToString(), connection);
            reader = command.ExecuteReader();
            while (reader.Read())
            {
                for (int j = 0; j < reader.FieldCount; j++)
                {
                    //countList.Add(reader[j].ToString());
                    CountComboBox.Items.Add(reader[j].ToString());
                }
            }
            reader.Dispose();
            command.Dispose();
            connection.Dispose(); 
        }

        private void OKBut_Click(object sender, RoutedEventArgs e)
        {
            //переменные, для проверок корректности ввода, а затем использования их при добавлении
            string ActionDate = String.Empty;//проверка даты
            double check = 0; // проверка суммы

            #region Проверки ввода данных
            //проверяем правильность вводма формата даты
            if (DataBox.Text != String.Empty)
            {
                //создаем массив date
                string[] date = new string[3];

                try //пытаемся преобразовать введенную дату
                {
                    date = DataBox.Text.Split('.');
                    DateTime myDate = new DateTime(Convert.ToInt32(date[2]), Convert.ToInt32(date[1]), Convert.ToInt32(date[0])); // формат гггг/мм/дд
                    //преобразуем, удалив время в часах и минутах и запишем в переменную:
                    ActionDate = myDate.ToString().Remove(11);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Дата введена неверно");  return;
                }
            }
            else
            {
                MessageBox.Show("Введите дату"); return;
            }

            //проверить правильность ввода суммы
            if (SumBox.Text != String.Empty)
            {
                try //пытаемся преобразовать введенную сумму
                {
                    check = Convert.ToDouble(SumBox.Text);
                    if (check <= 0)
                    {
                        MessageBox.Show("Сумма введена неверно"); return;
                    }
                }
                catch
                {
                    MessageBox.Show("Сумма введена неверно"); return;
                }

                //знак суммы определяем исходя из типа - доход или расход
                if (type == false) check *= -1;
            }
            else
            {
                MessageBox.Show("Введите сумму");
                return;
            }
            #endregion 

            if (CountComboBox.SelectedItem == null)
            {
                MessageBox.Show("Выберите счет");
                return; // выходим из метода
            }
            else 
            {
                try
                {
                    SqlConnection connection = new SqlConnection(_connectionString);
                    connection.Open(); // открыть считывание
                    StringBuilder query = new StringBuilder();

                    //сначала выберем ID счета, на который добавляем расход
                    query.Append("SELECT [ID счета] FROM Счета where [ID пользователя] = '");
                    query.Append(UserID + "' and Наименование = '");
                    query.Append(CountComboBox.SelectedItem.ToString() + "'");

                    SqlCommand command = new SqlCommand(query.ToString(), connection);
                    query.Clear();
                    SqlDataReader reader = command.ExecuteReader();

                    //переменная, хранящая ID счета
                    string temporaryCountID = String.Empty;
                    while (reader.Read())
                    {
                        temporaryCountID = reader[0].ToString();
                    }
                    reader.Dispose();
                    command.Dispose();

                    //получим ID категории
                    string temporaryCategoryID = String.Empty;
                    //при добавлении если категория пуста, то записать NULL
                    if (CategoryComboBox.SelectedItem == null)
                    {
                        temporaryCategoryID = String.Empty;
                    }
                    else
                    {
                        //название категории для расхода и дохода у одного пользователя может повторятся, поэтому еще нужно смотреть по виду - доход или расход
                        query.Append("SELECT [ID используемой категории] FROM [Используемые категории] where [ID пользователя] = '");
                        query.Append(UserID + "' and Наименование = '");
                        query.Append(CategoryComboBox.SelectedItem.ToString() + "' and Вид = '");
                        query.Append(type + "'"); //если type=true то доход иначе расход

                        command = new SqlCommand(query.ToString(), connection);
                        query.Clear();
                        reader = command.ExecuteReader();

                        while (reader.Read())
                        {
                            temporaryCategoryID = reader[0].ToString();
                        }
                        reader.Dispose();
                        command.Dispose();
                    }

                    if (ActionType) //добавляем запись
                    {
                        //добавим запись
                        query.Append("EXEC insert_consumeORprofit @Summa = ");
                        query.Append(check + ", @date = '");
                        query.Append(ActionDate + "', @CategoryID = ");

                        //ID категории может и не быть
                        if (temporaryCategoryID == String.Empty) query.Append("NULL, @CountID = '");
                        else query.Append("'" + temporaryCategoryID + "', @CountID = '");

                        query.Append(temporaryCountID + "', @definition = '");
                        query.Append(DefinitionBox.Text + "'");

                        command = new SqlCommand(query.ToString(), connection);
                        query.Clear();
                        reader = command.ExecuteReader();
                        reader.Read();
                        reader.Dispose();
                        command.Dispose();
                        connection.Dispose();
                        this.Close();
                    }
                    else if (ActionType == false) // изменяем характеристики записи
                    {
                        query.Clear();
                        query.Append("UPDATE [Расходы и доходы] SET Сумма = '");
                        query.Append(check);
                        query.Append("', Дата = '" + ActionDate + "',");
                        query.Append("[ID категории] = ");
                        //ID категории может и не быть
                        if (temporaryCategoryID == String.Empty) query.Append("NULL,");
                        else query.Append("'" + temporaryCategoryID + "',");

                        query.Append("[ID счета] ='" + temporaryCountID + "', Примечание = '");
                        query.Append(DefinitionBox.Text + "'");
                        query.Append(" FROM [Расходы и доходы] where [ID действия] = '" + ActionID + "'");

                        command = new SqlCommand(query.ToString(), connection);
                        reader = command.ExecuteReader();
                        reader.Read();
                        reader.Close();
                        command.Dispose();
                        connection.Dispose();
                        this.Close();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, "Ошибка чтения из базы данных" + Environment.NewLine + ex.Message); this.Close();
                }
            }
        }

        private void CancelBut_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void CalcImage_MouseDown(object sender, MouseButtonEventArgs e)
        {
            //но идет привязка к операционной системе!! просто писать свой калькулятор не хочу
            System.Diagnostics.Process externalProg = new System.Diagnostics.Process();
            externalProg.StartInfo.FileName = "calc.exe";
            externalProg.Start();
        }

        private void AddCategory_MouseDown(object sender, MouseButtonEventArgs e)
        {
            MyBoolAction _type = MyBoolAction.Consume;
            if (type)
            {
                _type = MyBoolAction.Profit;
            }
            else _type = MyBoolAction.Consume;

            CategoryCard categoryWin = new CategoryCard(UserID, String.Empty, String.Empty, _type, true);
            //false - расход, true - доход. Второй bool значит true - добавление, false изменение, которое нам не нужно
            categoryWin.ShowDialog();
            //обновить данные в комбобоксе
            LoadCombobox();
        }

        private void AddCount_MouseDown(object sender, MouseButtonEventArgs e)
        {
            CountCard countWin = new CountCard(UserID, String.Empty, String.Empty, String.Empty, true);
            //true - добавление счета
            countWin.ShowDialog();
        }

    }
}
